package QianFeng08.OptionalDemo;

import java.util.Optional;

/**
 * Optional容器类(JDK1.8)
 * 这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法 会返回该对象。
 *         of:  为非null的值创建一个Optional.
 * ofNullable:  为指定的值创建一个Optional, 如果指定的值为null,则返回一个空的Optional
 *  isPresent:  如果值存在返回true,否则返回false。
 *       get:   如果Optional有值则将其返回，否则抛出NoSuchElementException。
 * ifPresent:   如果Optional实例有值则为其调用consumer,否则不做处理
 *    orElse:   如果有值则将其返回，否则返回指定的其它值。
 *
 * orElseGet:
 *      orElseGet与orElse方法类似，区别在于得到的默认值。orElse方法将传入的字符串作为默认值，
 *      orEIseGet方法可以接受Supplier接口的实现用来生成默认值。
 * orElseThrow:
 *      如果有值则将其返回，否则抛出supplier接口创建的异常。
 * map:
 *      如果有值，则对其执行调用mapping函数得到返回值。如果返回值不为null,
 *      则创建包含mapping返回值的Optional作为map方法返回值，否则返回空Optional。
 * flatMap:
 *      如果有值，为其执行mapping函数返回Optional类型返回值，否则返回空Optional。
 *      flatMap与 map(Function)方法类似，区别在于flatMap中的mapper返回值必须是Optional。
 *      调用结束时，flatMap不会对结果用Optional封装。
 * filter:
 *      如果有值并且满足断言条件返回包含该值的Optional，否则返回空Optional。
 **/
public class OptionalDemo {

    public static void main(String[] args) {
        String str = "bin";
        //创建Optional对象的方法
        Optional<String> optional1 = Optional.of(str);
        Optional<String> optional2 = Optional.ofNullable(str);
        Optional<String> optional3 = Optional.empty();

        /*值相关*/
        System.out.println(optional1.isPresent());//值是否存在  true
        System.out.println(optional1.get());//返回对象的值
        System.out.println(optional1.orElse("无值"));//如果有值则将其返回，无值返回 “无值”
        //如果Optional实例有值则为其调用consumer,否则不做处理
        optional1.ifPresent(value -> System.out.println(value + "BIN"));
        //orElseGet与orElse方法类似，区别在于得到的默认值
        System.out.println(optional1.orElseGet(() -> "default"));

        //如果有值则将其返回，否则抛出supplier接口创建的异常
        try {
            optional1.orElseThrow(Exception::new);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //map
        Optional<String> optional4 =optional1.map(String::toUpperCase);
        System.out.println(optional4.orElse("没找到"));
        //flatMap
        optional4 = optional1.flatMap(value -> Optional.of(value.toUpperCase() + "-flatMap"));
        System.out.println(optional4.orElse("没找到"));

        //filter
        optional4 = optional1.filter(value -> value.length() > 3);
        System.out.println(optional4.orElse("这个值的长度小于3"));

    }


}
